iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

自己的 Leak, 自己抓(swift)系列 第 8

第一個工具 ID Visitor

  • 分享至 

  • xImage
  •  

第一個工具 ID Visitor

今天我們要撰寫第一個工具來蒐集所有的 ID

實作部分也很簡單只要遇到 ID 就直接儲存起來即可。

import SwiftSyntax
import SwiftParser

final class IdentifierVisitor: SyntaxVisitor {
  lazy var ids: [IdentifierExprSyntax] = []

  override final func visit(_ node: IdentifierExprSyntax) -> SyntaxVisitorContinueKind {
    ids.append(node)
    return .visitChildren
  }
}

private func parse(_ code: String) ->[String] {
  let ast = Parser.parse(source: code)
  let visitor = IdentifierVisitor(viewMode: .sourceAccurate)
  visitor.walk(ast)
  return visitor.ids.map {
    $0.withoutTrivia().description
  }
}

Test

然後透過測試來驗證剛剛所蒐集到的 ID

import Foundation
import SwiftSyntax
import SwiftParser
import XCTest

final class IDTests: XCTestCase {
  func testCode() {
    let code = """
    import Foundation

    let global = Out()

    class Out {
      func test() {
        print(global)
      }
    }

    func test() {
      class In {
        let a = 1
        func test(a: String) {
          let inner = In()
          print(self.a, a, 123)
          func test2() {
            escape {
              nonescape {
                self.test(a: "leak")
                print(inner)
              }
            }
          }
        }
      }
    }

    func escape(block: @escaping () -> Void) {}
    func nonescape(block: () -> Void) {}
    """

    let expect = [
      // let global = Out()
      "Out",
      /// print(global)
      "print", "global",
      /// let inner = In()
      "In",
      /// print(self.a, a, 123)
      "print", "self", "a",
      /// escape {
      "escape",
      /// nonescape {
      "nonescape",
      ///  self.test(a: "leak")
      "self",
      ///  print(inner)
      "print", "inner",
    ]
    XCTAssertEqual(parse(code), expect)
  }
}

進度

我們從一整段 code,進一步拿到所有 ID

TODO: 消除雜訊

https://ithelp.ithome.com.tw/upload/images/20230920/20158030KDN76nWdgE.png

https://ithelp.ithome.com.tw/upload/images/20230920/201580305WYf0rnScD.png


上一篇
深入 SyntaxVisitor
下一篇
一個 Visitor 解決不了,那就再加一個(Decl Visitor)
系列文
自己的 Leak, 自己抓(swift)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言